/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package proyecto2.vista;

import java.awt.Color;
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.List;
import proyecto2.logica.CrearAutomata;
import proyecto2.logica.DFA;
import proyecto2.logica.Estado;
import proyecto2.logica.NFA;
import proyecto2.logica.Transicion;

/**
 *
 * @author Minor Adrián
 */
public class MiPanel extends javax.swing.JPanel {

    NFA _nfa;
    DFA _dfa;
    List<EstadoGrafico> misEstados;

    /**
     * Creates new form PaelDibujo
     */
    public MiPanel(NFA nfa) {
        _nfa = nfa;
        misEstados = new ArrayList<>();
        initComponents();
    }

    private void crearEstadosGraficos() {
        int cantidad = _nfa.getEstados().size();
        int x = 0;
        int w = this.getWidth();
        int y = 75;
        int tam = w / (cantidad * 2);
        for (Estado e : _nfa.getEstados()) {
            x += tam + (tam / 3);
            misEstados.add(new EstadoGrafico(e, x, y, tam, tam));
        }
    }

    private void dibujarEstados(Graphics g) {
        g.setColor(Color.blue);
        int x, y, tam;
        for (EstadoGrafico eg : misEstados) {
            x = eg.getX();
            y = eg.getY();
            tam = eg.getWidth();
            if (eg.getMiEstado().ES_INICIAL()) {
                g.drawLine(x - 10, y - 10, (x + tam / 6), (y + tam / 6));
            }
            if (eg.getMiEstado().ES_FINAL()) {
                g.drawOval(x + 3, y + 3, tam - 6, tam - 6);
            }
            g.drawOval(eg.getX(), eg.getY(), eg.getWidth(), eg.getHeight());
            g.drawString(eg.getMiEstado().getId(), x + (tam / 2), y + (tam / 2));
        }
    }

    private void dibujarTransiciones(Graphics g) {

        int re = 0;
        int gr = 0;
        int bl = 0;
        for (Transicion t : _nfa.getTransiciones()) {
            g.setColor(new Color(re, gr, bl));

            EstadoGrafico egOrigen = buscarEstadoGrafico(t.getOrigen());
            int x0 = egOrigen.getX();
            int curva = 100;
            int y = egOrigen.getY();
            int tam = egOrigen.getWidth();
            EstadoGrafico egDestino = buscarEstadoGrafico(t.getDestino());
            int x1 = egDestino.getX();
            if (egOrigen.getMiEstado().equals(egDestino.getMiEstado())) {
                g.drawArc(x0 + tam / 2, y - curva / 2, 10, curva, 0, 180); // 
                g.drawString(t.getVariable(), x0 + tam / 2, y - curva / 2);

            } else if (x0 < x1) {
                g.drawArc(x0 + tam / 2, y + (tam - curva / 2), x1 - x0, curva, 180, 180);
                g.drawString(t.getVariable(), x0 + tam, y + tam + (curva / 2));
                g.drawLine(x0 + tam, y + (tam + curva / 2), (x0 + tam) + 5, (y + (tam + curva / 2)) + 5);
                g.drawLine(x0 + tam, y + (tam + curva / 2) + 10, (x0 + tam) + 5, (y + (tam + curva / 2)) + 5);
            } else {
                g.drawArc(x1 + tam / 2, y + (tam - curva / 2), x0 - x1, curva, 180, 180);
                g.drawString(t.getVariable(), x1 + tam, y + tam + (curva / 2));
                g.drawLine(x1 + tam, y + (tam + curva / 2), (x1 + tam) - 5, (y + (tam + curva / 2)) + 5);
                g.drawLine(x1 + tam, y + (tam + curva / 2) + 10, (x1 + tam) - 5, (y + (tam + curva / 2)) + 5);
            }
        }
    }

    private EstadoGrafico buscarEstadoGrafico(Estado e) {
        for (EstadoGrafico eg : misEstados) {
            if (eg.getMiEstado().equals(e)) {
                return eg;
            }
        }
        return null;

    }

    @Override
    public void paint(Graphics g) {
        g.setColor(Color.white);
        g.fillRect(0, 0, this.getWidth() - 15, this.getHeight() - 30);
        crearEstadosGraficos();
        dibujarEstados(g);
        dibujarTransiciones(g);

    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 525, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 364, Short.MAX_VALUE)
        );
    }// </editor-fold>//GEN-END:initComponents
    // Variables declaration - do not modify//GEN-BEGIN:variables
    // End of variables declaration//GEN-END:variables
}
